package com.elguile.laptop.casoDeUso;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;

import org.junit.Test;

import com.elguile.laptop.baseDatos.RepositorioVenta;
import com.elguile.laptop.casoDeUso.RegistroDeVenta;
import com.elguile.laptop.entidades.Linea;
import com.elguile.laptop.entidades.RelojFalso;
import com.elguile.laptop.entidades.Venta;
import com.elguile.laptop.errores.ExcepcionesDeSuficienteLineas;
import com.elguile.laptop.errores.ExepcionDeTextoVacio;

import static org.junit.Assert.*;

public class RegistroDeVentaDeberia {

	private static final BigDecimal CUATROSOLES = new BigDecimal("4");
	private static final BigDecimal TRESSOLES = new BigDecimal("3");
	private static final String POLLO = "pollo";
	private static final String GASEOSA = "gaseosa";

	@Test
	public void guardarEnBaseDeDatosUnaVentaCorrecta() {
		Date hoy = new Date(123456l);
		RepositorioVenta repositorioVenta = new RepositorioVenta();
		RegistroDeVenta registroDeVenta = new RegistroDeVenta(repositorioVenta,
				new RelojFalso(hoy));
		registroDeVenta.agrega(new Linea(1, GASEOSA, TRESSOLES));
		registroDeVenta.agrega(new Linea(2, POLLO, CUATROSOLES));
		registroDeVenta.registrar();
		Venta VentaGuardada = repositorioVenta.getPrimera();
		Linea primeraLinea = VentaGuardada.getPrimeraLinea();
		Linea segundaLinea = VentaGuardada.getLinea(1);
		assertNotNull(
				"la base de datos debe poner un identificador a la venta guardada",
				VentaGuardada.getCodigoVenta());
		assertEquals(repositorioVenta.cantidad(), 1);
		assertEquals(VentaGuardada.getFecha(), hoy);
		assertEquals(primeraLinea.getDescripcion(), GASEOSA);
		assertEquals(primeraLinea.getCantidad(), 1);
		assertEquals(primeraLinea.getPrecio(), TRESSOLES);
		assertEquals(segundaLinea.getDescripcion(), POLLO);
		assertEquals(segundaLinea.getCantidad(), 2);
		assertEquals(segundaLinea.getPrecio(), CUATROSOLES);

	}

	@Test(expected = ExepcionDeTextoVacio.class)
	public void lansarExcepcionConLineaConDescripcionNula() {
		RegistroDeVenta registroDeVenta = new RegistroDeVenta(
				new RepositorioVenta(), null);
		registroDeVenta.agrega(new Linea(1, null, BigDecimal.ZERO));
	}

	@Test(expected = ExepcionDeTextoVacio.class)
	public void lansarExcepcionConLineaConDescripcionVacia() {
		RegistroDeVenta registroDeVenta = new RegistroDeVenta(
				new RepositorioVenta(), null);
		registroDeVenta.agrega(new Linea(1, "", BigDecimal.ZERO));
	}

	@Test
	public void lansarExceptionConVentaSinDetalle() {
		RepositorioVenta repositorioVenta = new RepositorioVenta();
		try {
			RegistroDeVenta registroDeVenta = new RegistroDeVenta(
					repositorioVenta, null);
			registroDeVenta.registrar();
			fail("no debio registrar una venta vacia");
		} catch (ExcepcionesDeSuficienteLineas e) {
			assertEquals(
					"no se debe guardar nada en  la base de datos en caso de error",
					repositorioVenta.cantidad(), 0);
		}

	}

}
